﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Data.SqlClient;

namespace FrbaCommerce
{
    public class Publicacion
    {
        public Int32 codigo { get; set; }
        public string descripcion { get; set; }
        public int id_usuario { get; set; }
        public int stock { get; set; }
        public DateTime fecha { get; set; }
        public DateTime fecha_venc { get; set; }
        public decimal monto { get; set; }
        public List<Rubro> rubros;
        public int id_estado { get; set; }
        public int tipo { get; set; }
        public int id_visibilidad { get; set; }
        public bool preg_habilitadas { get; set; }

        public void GuardarPublicacion(Publicacion publicacion, string estado, string visibilidad, string tipo, string username)
        {
            DataSet datos = new DataSet();
            ConexionSql conexion = new ConexionSql();
            FuncionesComunes utils = new FuncionesComunes();
            datos.Tables.Add("Consulta");
            datos.Tables["Consulta"].Columns.Add("P_descripcion");
            datos.Tables["Consulta"].Columns.Add("P_stock");
            datos.Tables["Consulta"].Columns.Add("P_fecha_venc");
            datos.Tables["Consulta"].Columns.Add("P_fecha");
            datos.Tables["Consulta"].Columns.Add("P_monto");           
            datos.Tables["Consulta"].Columns.Add("P_visibilidad");
            datos.Tables["Consulta"].Columns.Add("P_username");
            datos.Tables["Consulta"].Columns.Add("P_descr_estado");
            datos.Tables["Consulta"].Columns.Add("P_descr_tipo");
            datos.Tables["Consulta"].Columns.Add("P_preguntas_habilitadas");

            datos.Tables["Consulta"].Rows.Add();
            datos.Tables["Consulta"].Rows[0]["P_descripcion"] = this.descripcion;
            datos.Tables["Consulta"].Rows[0]["P_stock"] = this.stock;
            datos.Tables["Consulta"].Rows[0]["P_fecha_venc"] =  utils.getFormatoFecha(this.fecha_venc);
            datos.Tables["Consulta"].Rows[0]["P_fecha"] = utils.getFormatoFecha(this.fecha);
            datos.Tables["Consulta"].Rows[0]["P_monto"] = this.monto.ToString().Replace(',','.');
            datos.Tables["Consulta"].Rows[0]["P_visibilidad"] = visibilidad;
            datos.Tables["Consulta"].Rows[0]["P_username"] = username;
            datos.Tables["Consulta"].Rows[0]["P_descr_estado"] = estado;
            datos.Tables["Consulta"].Rows[0]["P_descr_tipo"] = tipo;
            datos.Tables["Consulta"].Rows[0]["P_preguntas_habilitadas"] = Convert.ToInt16(this.preg_habilitadas);

            conexion.Consulta(datos, "[ASDF].[CREAR_PUBLICACION]");
        }

        public void Editar(Publicacion p)
        {
            ConexionSql conexion = new ConexionSql();
            DataSet datos = new DataSet();
            FuncionesComunes utils = new FuncionesComunes();

            string query = "UPDATE ASDF.Publicacion SET ";
            query += " descripcion = '" + p.descripcion + "', stock = " + p.stock + ", fecha = '" + utils.getFormatoFecha(p.fecha) + "', fecha_venc= '" + utils.getFormatoFecha(p.fecha_venc) + "',";
            query += "monto = " + (p.monto.ToString().Replace(',', '.')) + ", tipo = " + p.tipo + ", estado = " + p.id_estado + ", visibilidad = " + p.id_visibilidad + ", preguntas_habilitadas = " + Convert.ToInt32(p.preg_habilitadas) + " ";
            query += "WHERE cod = " + p.codigo + " ";

            if (p.id_estado == 4 && /*FINALIZADA*/
                p.tipo == 2 /*SUBASTA*/ )
            {
                this.finalizarOferta(p.codigo);
            }
            conexion.ejecutarConsulta(query);   
        }

        public void cargarCodPublicacion(TextBox texto)
        {
            string query = " SELECT TOP 1 cod FROM ASDF.Publicacion ORDER BY cod DESC ";
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            datos = conexionSql.ejecutarConsulta(query);
            DataRow fila = datos.Tables[0].Rows[0];
            int aux = Convert.ToInt32(fila.ItemArray[0].ToString()) + 1;
            texto.Text = aux.ToString();
        }

        public bool CargarComboPublicaciones(int idUsuario, ComboBox cmbPublicacion)
        {
            string query = "SELECT descripcion FROM ASDF.Publicacion WHERE usuario = " + idUsuario + "";
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            datos = conexionSql.ejecutarConsulta(query);
            cmbPublicacion.DataSource = null;
            if (datos.Tables[0].Rows.Count== 0)
            {
                return false;
            }
            else
            {
                foreach (DataRow dataRow in datos.Tables[0].Rows)
                {
                    cmbPublicacion.Items.Add(dataRow[0]);
                }
                return true;
            }               
        }

        public bool CargarComboPublicacionesFinalizadas(int idUsuario, ComboBox cmbPublicacion)
        {            
            string query = "SELECT P.cod, P.descripcion, P.usuario, P.stock, P.fecha, P.fecha_venc, P.monto, P.tipo, P.estado, P.visibilidad, P.preguntas_habilitadas ";
            query += "FROM ASDF.Publicacion P WHERE P.estado = 4 AND P.usuario = " + idUsuario + " AND  ";
            query += "P.cod NOT IN (select cod_publi FROM ASDF.Factura_Item WHERE cod_publi = P.cod) ";
            query += "ORDER BY P.fecha ASC ";
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            datos = conexionSql.ejecutarConsulta(query);
            cmbPublicacion.DataSource = null;
            if (datos.Tables[0].Rows.Count == 0)
            {
                return false;
            }
            else
            {
                foreach (DataRow fila in datos.Tables[0].Rows)
                {
                    cmbPublicacion.Items.Add(fila.ItemArray[1].ToString());
                }
                return true;
            }
        }

        public List<Publicacion> ObtenerPublicaciones(int idUsuario) 
        {
            List<Publicacion> lista = new List<Publicacion>();
            /*Me traigo las publicaciones finalizadas que no estan facturadas */
            string query = "SELECT P.cod, P.descripcion, P.usuario, P.stock, P.fecha, P.fecha_venc, P.monto, P.tipo, P.estado, P.visibilidad, P.preguntas_habilitadas ";
            query += "FROM ASDF.Publicacion P WHERE P.estado = 4 AND P.usuario = " + idUsuario + " AND  ";
            query += "P.cod NOT IN (select cod_publi FROM ASDF.Factura_Item WHERE cod_publi = P.cod) ";
            query += "ORDER BY P.fecha ASC ";           
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            datos = conexionSql.ejecutarConsulta(query);
            if (datos.Tables[0].Rows.Count>0)
            {
                foreach (DataRow fila in datos.Tables[0].Rows)
                {
                    lista.Add(this.cargarPublicacion(fila));
                }
            }            
            return lista;            
        }

        public List<Publicacion> ObtenerPublicacionesFacturadas(int idUsuario)
        {
            List<Publicacion> lista = new List<Publicacion>();
            string query = "SELECT P.cod, P.descripcion, P.usuario, P.stock, P.fecha, P.fecha_venc, P.monto, P.tipo, P.estado, P.visibilidad, P.preguntas_habilitadas ";
            query += "FROM ASDF.Publicacion P JOIN ASDF.Factura_Item Fi ON Fi.cod_publi = P.cod ";
            query = "WHERE P.usuario = " + idUsuario + " ";            
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = new DataSet();
            datos = conexionSql.ejecutarConsulta(query);
            if (datos.Tables[0].Rows.Count > 0)
            {
                foreach (DataRow fila in datos.Tables[0].Rows)
                {
                    lista.Add(this.cargarPublicacion(fila));
                }
            }
            return lista;
        }

        public Publicacion ObtenerPublicacionPorDescripcion(string descripcion)
        {
            Publicacion p = new Publicacion();
            string query = "SELECT * FROM ASDF.Publicacion WHERE descripcion = '" + descripcion + "' ";
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = conexionSql.ejecutarConsulta(query);
            p = this.cargarPublicacion(datos.Tables[0].Rows[0]);            
            p.rubros = new PublicacionRubro().buscarRubrosDePublicacion(p.codigo);
            return p;
        }

        public int VerificarVisibilidadGratuita(int idUsuario)
        {
            int cantidad;
            string query = "SELECT COUNT(*) FROM ASDF.Publicacion P JOIN ASDF.Visibilidad V ON P.visibilidad = V.codigo ";
            query += "WHERE P.estado = 2 AND V.descripcion = 'Gratis' AND P.usuario = " + idUsuario + " ";
            ConexionSql conexionSql = new ConexionSql();
            DataSet datos = conexionSql.ejecutarConsulta(query);
            DataRow fila = datos.Tables[0].Rows[0];
            cantidad = Convert.ToInt32(fila.ItemArray[0].ToString());
            return cantidad;
        }

        private Publicacion cargarPublicacion(DataRow fila)
        {
            Publicacion publicacion = new Publicacion();
            publicacion.codigo = Convert.ToInt32(fila.ItemArray[0].ToString());
            publicacion.descripcion = fila.ItemArray[1].ToString();
            publicacion.id_usuario = Convert.ToInt16(fila.ItemArray[2].ToString());
            publicacion.stock = Convert.ToInt16(fila.ItemArray[3].ToString());
            publicacion.fecha = Convert.ToDateTime(fila.ItemArray[4].ToString());
            publicacion.fecha_venc = Convert.ToDateTime(fila.ItemArray[5].ToString());
            publicacion.monto = Convert.ToDecimal(fila.ItemArray[6].ToString()); 
            publicacion.tipo = Convert.ToInt16(fila.ItemArray[7].ToString());
            publicacion.id_estado = Convert.ToInt16(fila.ItemArray[8].ToString()); 
            publicacion.id_visibilidad = Convert.ToInt16(fila.ItemArray[9].ToString());
            publicacion.preg_habilitadas = Convert.ToBoolean(fila.ItemArray[10].ToString());
            return publicacion;
        }

        public void getDatosPorCodigo(decimal codigo)
        {
            DataSet datos = new DataSet();
            ConexionSql conexion = new ConexionSql();
            String query = "SELECT * from ASDF.Publicacion WHERE cod=";
            query += codigo.ToString() + " ;";

            try
            {
                datos = conexion.ejecutarConsulta(query);
                Publicacion publi = cargarPublicacion(datos.Tables[0].Rows[0]);
                this.codigo = publi.codigo;
                this.descripcion = publi.descripcion;
                this.id_usuario = publi.id_usuario;
                this.stock = publi.stock;
                this.fecha = publi.fecha;
                this.fecha_venc = publi.fecha_venc;
                this.monto = publi.monto;
                //this.id_rubro = publi.id_rubro;
                this.id_estado = publi.id_estado;
                this.tipo = publi.tipo;
                this.id_visibilidad = publi.id_visibilidad;
                this.preg_habilitadas = publi.preg_habilitadas;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problema de conexión con la BD: " + ex.Message);
            }
        }

        private void finalizarOferta(Decimal codigo)
        {
            DataSet datos = new DataSet();
            ConexionSql conexion = new ConexionSql();
            datos.Tables.Add("Consulta");
            datos.Tables["Consulta"].Columns.Add("P_cod_publi");
            datos.Tables["Consulta"].Rows.Add();
            datos.Tables["Consulta"].Rows[0]["P_cod_publi"] = codigo;

            conexion.Consulta(datos, "[ASDF].[REGISTRAR_COMPRA_FINALIZAR_SUBASTA]");
        }
    }
}